from flask import get_flashed_messages, request, flash, render_template, redirect, url_for, session
from models.lineaBase import metadata, LineaBase
from models.database import db_session
import sys
#import bz2

from models.lineaBaseManager import LineaBaseManager
from models.proyectoManager import ProyectoManager
from models.faseManager import FaseManager
from models.itemManager import ItemManager
from models.estadoLBManager import EstadoLBManager
from models.estadoItemManager import EstadoItemManager
estadoItemMgr= EstadoItemManager()
estadoLBMgr= EstadoLBManager()
itemMgr= ItemManager()
proyectoMgr= ProyectoManager()
faseMgr= FaseManager()
lineaBaseMgr = LineaBaseManager()


"""
Clase que contiene los metodos relacionados con la gestion de lineas base del sistema
"""

def abmLineaBase():
    """ Metodo encargado de la gestion de lineas base de un proyecto """
    filtro=""
    if request.method == "POST":
        idfase = request.form["idfase"]
        filtro = request.form["filtro"]
        fase = faseMgr.getFase(idfase)
        idproyecto = session['idproyecto']
        proyecto = proyectoMgr.getProyecto(idproyecto)
        return paginarLineaBase(idfase, fase, 1, filtro, proyecto = proyecto, action= "abmLineaBase")
    if request.method == "GET":
        idproyecto = session['idproyecto']
        proyecto = proyectoMgr.getProyecto(idproyecto)
        if session['idfase']:
            if request.args.getlist("filtro"):
                filtro = request.args.getlist("filtro")[0]
            pagina = 1
            if request.args.getlist("pagina"):
                pagina = request.args.getlist("pagina")[0]
            idfase = session['idfase']
            fase = faseMgr.getFase(idfase)
            return paginarLineaBase(idfase, fase,pagina , filtro, proyecto = proyecto, action= "abmLineaBase")
        else:
            if session['idproyecto']:
                flash(u"Seleccionar una fase del proyecto antes de realizar la operaci\u00f3n", "error")
            else:
                flash(u"Seleccionar un proyecto antes de realizar la operaci\u00f3n", "error")
            return redirect(url_for("configurarFase", action= "abmLineaBase"))

def crearLineaBase():
    """ Metodo encargado de guardar una linea base """
    
    if request.method == "POST":
        observacion = request.form["observacion"]
        idfase = request.form["idfase"]
        fase = faseMgr.getFase(idfase)
        estadolb = estadoLBMgr.getEstadoLBPorNombre("abierta")
        iditems = request.form.getlist("check")

        lineaBase1= LineaBase(observacion, len(iditems))
        lineaBase1.estadoLB=estadolb
        items =[]
        b=0
        for i in xrange(0, len(iditems)):
            item = itemMgr.getItem(iditems[i])
            if item.estadoItem.nombre == "aprobado":
                items.append(item)
            else:
                b=1
                flash("El item: "+item.nombre+" posee estado "+item.estadoItem.nombre+" y no puede estar en una linea base","error")
        lineaBase1.items=items
        if b==0:
            lineaBaseMgr.guardarLineaBase(lineaBase1)
            fase.cant_lineabase= fase.cant_lineabase+1
            faseMgr.guardarFase(fase)
        else:
            flash("La linea base no fue insertada","error")
        return redirect(url_for("abmLineaBase", idfase=idfase, filtro = request.form["filtro"]))
    else:
        idfase = request.args.getlist("idfase")[0]
        items = itemMgr.getItemsPorFase(idfase)
        return render_template("crearLineaBase.html",items=items, idfase=idfase, filtro = request.args.getlist("filtro")[0])

def modificarLineaBase():
    """ Metodo encargado de modificar una linea base """
    
    if request.method == "POST":
        observacion = request.form["observacion"]
        idfase = request.form["idfase"]
        fase = faseMgr.getFase(idfase)
        estadolb = estadoLBMgr.getEstadoLBPorNombre("abierta")
        iditems = request.form.getlist("check")
        lineaBase1= LineaBase(observacion, len(iditems))
        lineaBase1.estadoLB=estadolb
        items =[]
        b=0
        for i in xrange(0, len(iditems)):
            item = itemMgr.getItem(iditems[i])
            if item.estadoItem.nombre == "aprobado":
                items.append(item)
            else:
                b=1
                flash("El item: "+item.nombre+" posee estado "+item.estadoItem.nombre+" y no puede estar en una linea base","error")
        lineaBase1.items=items
        if b==0:
            lineaBaseMgr.guardarLineaBase(lineaBase1)
        else:
            flash("La linea base no fue modificada","error")
        return redirect(url_for("abmLineaBase", idfase=idfase, filtro = request.form["filtro"]))
    else:
        idfase = request.args.getlist("idfase")[0]
        idlineabase = request.args.getlist("idlineabase")[0]
        items = itemMgr.getItemLB(idlineabase)
        lineaBase=lineaBaseMgr.getLineaBase(idlineabase)
        return render_template("modificarLineaBase.html", lineaBase=lineaBase,items=items, idfase=idfase, filtro = request.args.getlist("filtro")[0])

def agregarItemLb():
    """ Metodo encargado de guardar items en una linea base """
    
    if request.method == "POST":
        idfase = request.form["idfase"]
        idlineabase = request.form["idlineabase"]
        lineaBase = lineaBaseMgr.getLineaBase(idlineabase)
        fase = faseMgr.getFase(idfase)
        iditems = request.form["check"]
        items = lineaBase.items
        b=0
        item = itemMgr.getItem(iditems)
        if item.estadoItem.nombre == "aprobado":
            items.append(item)
        else:
            b=1
            flash("El item: "+item.nombre+" posee estado "+item.estadoItem.nombre+" y no puede estar en una linea base","error")
        lineaBase.items=items
        if b==0:
            lineaBase.cant_items= lineaBase.cant_items+1
            lineaBaseMgr.guardarLineaBase(lineaBase)
        else:
            flash("Item no fue insertado","error")
        return redirect(url_for("modificarLineaBase",idlineabase=lineaBase.idlineabase, idfase=idfase, filtro = request.form["filtro"]))
    else:
        idfase = request.args.getlist("idfase")[0]
        idlineabase = request.args.getlist("idlineabase")[0]
        items = itemMgr.getItemsPorFase(idfase)
        return render_template("agregarItemLb.html", idlineabase=idlineabase, items = items, idfase = idfase, filtro = request.args.getlist("filtro")[0])

def eliminarItemLb():
    """ Metodo encargado de eliminar un item de una linea base """
    
    if request.method == "GET":
        idfase = request.args.getlist("idfase")[0]
        iditem = request.args.getlist("iditem")[0]
        idlineabase = request.args.getlist("idlineabase")[0]
        lineaBase = lineaBaseMgr.getLineaBase(idlineabase)
        lineaBase.cant_items= lineaBase.cant_items-1
        lineaBaseMgr.guardarLineaBase(lineaBase)
        estadoItem = estadoItemMgr.getEstadoItemPorNombre("en revision")
        item = itemMgr.getItem(iditem)
        item.estadoItem= estadoItem
        item.lineaBase=None
        itemMgr.guardarItem(item)
        flash("Item fue eliminado de la linea base exitosamente")
        return redirect(url_for("modificarLineaBase",idlineabase=idlineabase, idfase=idfase, filtro = request.args.getlist("filtro")[0]))

def abrirLineaBase():
    """ Metodo encargado de abrir una linea base (romper)"""
    
    if request.method == "POST":
        idlineabase = request.form["idlineabase"]
        lineaBase = lineaBaseMgr.getLineaBase(idlineabase)
        items = lineaBase.items
        estadoItem = estadoItemMgr.getEstadoItemPorNombre("en revision")
        for i in xrange(0, len(items)):
            item = itemMgr.getItem(items[i].iditem)
            item.estadoItem= estadoItem
            itemMgr.guardarItem(item)
        estadolb = estadoLBMgr.getEstadoLBPorNombre("abierta")
        lineaBase.estadoLB=estadolb
        lineaBaseMgr.guardarLineaBase(lineaBase)
        idfase = request.form["idfase"]
        session["_flashes"]=[]
        flash("Linea Base abierta exitosamente")
        return redirect(url_for("abmLineaBase", idfase=idfase, filtro = request.form["filtro"]))
    if request.method == "GET":
        idlineabase = request.args.getlist("idlineabase")[0]
        lineaBase = lineaBaseMgr.getLineaBase(idlineabase)
        idfase = request.args.getlist("idfase")[0]
        items = lineaBase.items
        return render_template("abrirLineaBase.html", items=items,lineaBase=lineaBase, idfase=idfase, filtro= request.args.getlist("filtro")[0])

def consultarLineaBase():
    """ Metodo encargado de consultar los datos de una linea base """
    
    if request.method == "GET":
        idlineabase = request.args.getlist("idlineabase")[0]
        lineaBase = lineaBaseMgr.getLineaBase(idlineabase)
        idfase = request.args.getlist("idfase")[0]
        items = itemMgr.getItemLB(idlineabase)
        return render_template("consultarLineaBase.html",items=items, idfase=idfase, lineaBase = lineaBase, filtro = request.args.getlist("filtro")[0])
    else:
        idfase = request.form["idfase"]
        return redirect(url_for("abmLineaBase", idfase=idfase, filtro = request.form["filtro"]))

def aprobarLineaBase():
    """ Metodo encargado de aprobar una linea base """
    
    if request.method == "GET":
        idlineabase = request.args.getlist("idlineabase")[0]
        lineaBase = lineaBaseMgr.getLineaBase(idlineabase)
        idfase = request.args.getlist("idfase")[0]
        items = itemMgr.getItemLB(idlineabase)
        return render_template("aprobarLineaBase.html",items=items, idfase=idfase, lineaBase = lineaBase, filtro = request.args.getlist("filtro")[0])
    else:
        idlineabase = request.form["idlineabase"]
        idfase = request.form["idfase"]
        lineaBase = lineaBaseMgr.getLineaBase(idlineabase)
        items = itemMgr.getItemLB(idlineabase)
        estadoItem = estadoItemMgr.getEstadoItemPorNombre("en lineabase")
        for i in xrange(0, len(items)):
            item = itemMgr.getItem(items[i].iditem)
            item.estadoItem= estadoItem
            itemMgr.guardarItem(item)
        estadolb = estadoLBMgr.getEstadoLBPorNombre("aprobada")
        lineaBase.estadoLB=estadolb
        lineaBaseMgr.guardarLineaBase(lineaBase)
        session["_flashes"]=[]
        flash("Linea Base aprobada exitosamente")
        return redirect(url_for("abmLineaBase", idfase=idfase, filtro = request.form["filtro"]))

def paginarLineaBase(idfase, fase, pagina, filtro, proyecto, action):
    """ Metodo encargado de la busqueda de lineas base a partir de un filtro """
    porPagina= 5
    pagina = int(pagina)
    total = lineaBaseMgr.getLineaBasePaginado(idfase, observacion=filtro, desde=None, hasta=None)
    if total % porPagina == 0:
        cantPaginas= total/porPagina
    else:
        resto = total % porPagina
        subtotal = (total-resto)
        cantPaginas= (subtotal/porPagina) + 1
    hasta = pagina * porPagina
    desde = hasta - porPagina
    lineas = lineaBaseMgr.getLineaBasePaginado(idfase, filtro, desde, hasta)
    return render_template("abmLineaBase.html", lista = lineas, idfase = idfase, fase =fase,\
        filtro = filtro, form=request.form, primera=1, ultima= cantPaginas, ant= pagina-1,\
        sig=pagina +1, cantPaginas = cantPaginas, pagina = pagina, proyecto = proyecto, action=action)
  
